/***
 * @Description:定义并实现链表功能，包括链表的增删改查和相关数据变量的定义的头文件
 * @Author: Liverpool
 * @Date: 2024-02-15 02:19:49
 * @LastEditTime: 2024-02-15 02:21:50
 * @LastEditors: Liverpool
 */
#ifndef LIST_H
#define LIST_H

#include "stdbool.h"

// 定义通用链表的结点数据结构
typedef struct _list_node_t
{
    struct _list_node_t *pre;  // 前结点
    struct _list_node_t *next; // 后结点
} D_ListNode;
// 定义通用链表结构
typedef struct _list_t
{
    D_ListNode *first; // 定义头结点
    D_ListNode *last;  // 定义尾结点
    int count;         // 定义链表中的结点数量
} D_List;

// 遍历链表
#define list_for_each_node(node, list) for ((node) = (list)->first; (node); (node) = (node)->next)

/*计算偏移量*/
#define offsetof(type, member) ((char *)(&(((type *)0))->member))
/*返回大结构体的头指针*/
#define container_of(ptr, type, member) (type *)((char *)ptr - offsetof(type, member))
/* 防止小于0情况的出现*/
#define list_entry(ptr, type, member) ((ptr) ? container_of((ptr), type, member) : (type *)0)
//***********************************外部函数定义区***********************************************
void list_init(D_List *list);                                            // 链表初始化
void list_insert_first(D_List *list, D_ListNode *node);                  // 在链表头部插入结点
void list_insert_last(D_List *list, D_ListNode *node);                   // 在链表尾部插入结点
void list_insert_after(D_List *list, D_ListNode *pre, D_ListNode *node); // 在链表的指定结点后插入新结点
D_ListNode *list_remove_node(D_List *list, D_ListNode *node);            // 在链表中删除固定结点
//*****************************************内联函数定义区*******************************************************
/***
 * @description: 链表结点初始化
 * @Author: Liverpool
 * @Date: 2024-02-15 02:34:09
 * @return {*}
 * @param {D_ListNode} *node 需要初始化的链表结点
 */
static inline void list_node_init(D_ListNode *node)
{
    node->pre = (D_ListNode *)0;
    node->next = (D_ListNode *)0;
}
/***
 * @description: 获取当前链表的前结点
 * @Author: Liverpool
 * @Date: 2024-02-15 02:36:05
 * @return {*} 当前链表结点的前结点指针
 * @param {D_ListNode} *node 需要查询的当前链表结点
 */
static inline D_ListNode *list_node_get_pre(D_ListNode *node)
{
    return (D_ListNode *)node->pre;
}
/***
 * @description: 获取当前链表的后结点
 * @Author: Liverpool
 * @Date: 2024-02-15 02:36:05
 * @return {*} 当前链表结点的后结点指针
 * @param {D_ListNode} *node 需要查询的当前链表结点
 */
static inline D_ListNode *list_node_get_next(D_ListNode *node)
{
    return (D_ListNode *)node->next;
}
/***
 * @description: 设置当前链表结点的后结点
 * @Author: Liverpool
 * @Date: 2024-02-15 02:41:04
 * @return {*}
 * @param {D_ListNode} *node 需要设置的当前链表结点
 * @param {D_ListNode} *next_node 需要设置的当前链表结点的后结点
 */
static inline void list_node_set_next(D_ListNode *node, D_ListNode *next_node)
{
    node->next = next_node;
    next_node->pre = node;
}
/***
 * @description: 判断当前链表是否为空
 * @Author: Liverpool
 * @Date: 2024-02-16 02:06:06
 * @return {*}  true 说明当前链表为0 false 说明当前链表非空
 * @param {D_List} *list 需要判断的链表地址
 */
static inline bool list_is_empty(D_List *list)
{
    return list->count == 0;
}
/***
 * @description: 返回当前链表中的结点个数
 * @Author: Liverpool
 * @Date: 2024-02-16 02:08:24
 * @return {*} 当前链表中的结点个数
 * @param {D_List} *list 需要查询的链表地址
 */
static inline int list_get_count(D_List *list)
{
    return list->count;
}
/***
 * @description: 返回当前链表中的头结点
 * @Author: Liverpool
 * @Date: 2024-02-16 02:29:14
 * @return {*} 链表的头结点
 * @param {D_List} *list 需要查询的链表地址
 */
static inline D_ListNode *list_get_first(D_List *list)
{
    return list->first;
}
/***
 * @description: 返回当前链表中的尾结点
 * @Author: Liverpool
 * @Date: 2024-02-16 02:29:14
 * @return {*} 链表的尾结点结点
 * @param {D_List} *list 需要查询的链表地址
 */
static inline D_ListNode *list_get_last(D_List *list)
{
    return list->last;
}
/***
 * @description: 移除链表的头结点
 * @Author: Liverpool
 * @Date: 2024-02-18 01:28:10
 * @return {*} 删除的链表的头结点
 * @param {D_List} *list 需要删除的链表
 */
static inline D_ListNode *list_remove_first(D_List *list)
{
    D_ListNode *first = list_get_first(list);
    if (first)
    {
        list_remove_node(list, first);
    }
    return first;
}
/***
 * @description: 移除链表的尾结点
 * @Author: Liverpool
 * @Date: 2024-02-18 01:28:10
 * @return {*} 删除的链表的尾结点
 * @param {D_List} *list 需要删除的链表
 */
static inline D_ListNode *list_remove_last(D_List *list)
{
    D_ListNode *last = list_get_last(list);
    if (last)
    {
        list_remove_node(list, last);
    }
    return last;
}
#endif // !LIST_H